package com.ruoyi.common.utils;

import com.alibaba.fastjson2.JSON;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.data.RowRenderData;
import com.deepoove.poi.data.Rows;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import com.ruoyi.common.utils.poi.ServerTableData;
import com.ruoyi.common.utils.poi.ServerTablePolicy;

import java.io.*;
import java.util.*;

/**
 * 生成Word工具类
 */
public class ExportWordUtils {
    public static boolean exportWord(String templatePath, String temDir, String fileName, Map<String, Object> params) {
        if (!temDir.endsWith("/")) {
            temDir = temDir + File.separator;
        }
        File dir = new File(temDir);
        if (!dir.exists()) {
            dir.mkdirs();
        }

        try {
            boolean isPolicy = false;
            LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
            ConfigureBuilder builder = Configure.builder();
            //poi-tl 配置
            for(String key : params.keySet()) {
                if(key.contains("List")) {
                    isPolicy = true;
                    builder.bind(key, policy);
                }
            }
            XWPFTemplate doc;
            if(isPolicy) {
                 doc = XWPFTemplate.compile(templatePath, builder.build()).render(params);
            }else {
                 doc = XWPFTemplate.compile(templatePath).render(params);
            }
            String tmpPath = temDir + fileName;// 新文件路径
            FileOutputStream fos = new FileOutputStream(tmpPath);
            doc.write(fos);
            fos.flush();
            fos.close();
            doc.close();
            System.out.println("测试报告路径：" + tmpPath);
            return true;
        } catch (Exception e) {
            System.out.println("=== 生成报告异常 " + JSON.toJSON(e));
            e.printStackTrace();
            return false;
        } finally {
            // delFileWord(temDir,fileName);//这一步看具体需求，要不要删
        }
    }


    public static void delFileWord(String filePath, String fileName) {// 删除文件
        File file = new File(filePath + fileName);
        File file1 = new File(filePath);
        file.delete();
        file1.delete();
    }


    /**
     * 测试通风机
     */
    public static void main(String[] args) {
        Map<String, Object> datas = new HashMap<>();
        datas.put("受检单位", "1111111");
        datas.put("设备名称", "1234567");
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

        for (int i = 0; i < 3; i++) {    //用循环添加每行的数据，添加3行数据
            Map<String, Object> detailMap = new HashMap<String, Object>();//将word中标签名的例和对应数据保存到map
            detailMap.put("序号", i + 1);
            detailMap.put("温度", "123");
            detailMap.put("大气压力", "核心土留置");
            detailMap.put("相对静压", "hh");
            detailMap.put("风速", "hh");
            detailMap.put("风量", "hh");
            list.add(detailMap);//将设置好的行保存到list集合中
        }

        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
        Configure config = Configure.builder().bind("性能测试数据List", policy).build();//设置列表配置，如果有多个列表时需加.bind("list1", policy) 新列表配置即可
        datas.put("性能测试数据List", list);        //将列表保存到渲染的map中
        //3.创建XWPFTemplate对象，并设置读取模板路径和要渲染的数据
        XWPFTemplate template = XWPFTemplate.compile("D:\\cloud-platform-root\\uploadPath\\template\\tfj.docx", config).render(datas);
        //compile(模板路径,对应的配置)方法是设置模板路径和模板配置的，如果不设置配置时可不传config
        //render(datas)方法是用来渲染数据，将准备好的map数据方进去渲染
        //4.模板的输出，用FileOutputStream输出流（可以输出到指定文件位置，也可以用ajax直接返回给浏览器下载）
        FileOutputStream out = null;//创建文件输出流并指定位置
        try {
            out = new FileOutputStream("D:\\cloud-platform-root\\uploadPath\\document\\out_example_payment.docx");
            template.write(out);
            out.flush();
            out.close();
            template.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

